package game;

import java.util.Random;
import java.util.Scanner;

import static game.BattleResul.handleBattleResult;
import static game.InventoryManager.useItem;
import static game.MonsterFactory.createMonster;
import static game.PlayerStatus.displayPlayerStatus;
import static game.Shop.enterShop;
import static game.SkillManager.useSkill;

public class MonsterGame {

    static class Monster {
        int level = 1;
        int hp;
        int attack;
        int defense;  // 防御力
        int intelligence;  // 智力
        int stamina;  // 体力
        int dodge;  // 躲避
        String name;
        int gold; // 金币

        String abilityName; // 怪物技能名称
        int abilityCooldown; // 技能冷却回合数

        int initialAbilityCooldown; // 技能初始冷却回合数


        Monster(int level, int hp, int attack, int defense, int intelligence, int stamina, int dodge, String name, int gold, String abilityName, int abilityCooldown) {
            this.level = level;
            this.hp = hp;
            this.attack = attack;
            this.defense = defense;
            this.intelligence = intelligence;
            this.stamina = stamina;
            this.dodge = dodge;
            this.name = name;
            this.gold = gold;
            this.abilityName = abilityName;
            this.abilityCooldown = abilityCooldown;
            this.initialAbilityCooldown = abilityCooldown; // 初始化初始冷却时间
        }

        public void useAbility(Player player) {
            Random random = new Random();
            int chance = random.nextInt(100) + 1; // 生成一个1到100之间的随机数
            int threshold = 40; // 40%尝试使用能力的机会
            if (chance <= threshold) {
                if (abilityCooldown <= 0) {
                    // 你使用能力的现有逻辑
                    // 例如：
                    // 对玩家应用技能效果
                    if (abilityName.equals("毒素")) {
                        player.hp -= 35; // 例如：毒素每回合造成 35 点伤害
                        System.out.println(this.name + " 使用了毒素！你受到 35 点伤害。");
                    } else if (abilityName.equals("火焰吐息")) {
                        player.hp -= this.intelligence * 2; // 例如：火焰吐息造成 2 倍智力伤害
                        System.out.println(this.name + " 使用了火焰吐息！你受到 " + (this.intelligence * 2) + " 点伤害。");
                    } else if (abilityName.equals("石化")) {
                        // 例如：石化使玩家的攻击力降低 50%
                        player.originalAttack = player.attack; // 记录石化后的攻击力
                        player.attack /= 2;
                        player.isStone = true;  // 设置石化状态
                        System.out.println(this.name + " 使用了石化！你的攻击力降低 50%。");
                    } else if (abilityName.equals("治疗")) {
                        // 例如：治疗使怪物恢复一定生命值
                        this.hp += this.stamina * 0.5;
                        System.out.println(this.name + " 使用了治疗！恢复了 " + (this.stamina * 0.5) + " 点生命值。");
                    } else if (abilityName.equals("狂暴")) {
                        // 例如：狂暴使怪物的攻击力提高 30%
                        this.attack *= 1.3;
                        System.out.println(this.name + " 使用了狂暴！攻击力提高了 30%。");
                    } else if (abilityName.equals("护盾")) {
                        // 例如：护盾使怪物的防御力提高 50%
                        this.defense *= 1.5;
                        System.out.println(this.name + " 使用了护盾！防御力提高了 50%。");
                    } else if (abilityName.equals("召唤")) {
                        // 例如：召唤生成一个新的怪物
                        // 可以在这里创建一个新的怪物对象
                        // 并将其添加到游戏场景中
                        System.out.println(this.name + " 使用了召唤！生成了一个新的怪物。");
                    }
                    // 在这里添加其他能力

                    abilityCooldown = initialAbilityCooldown; // 重置冷却时间
                }
            } else {
                // 怪物决定不使用技能时的逻辑
                System.out.println(this.name + " 在这个回合选择了不使用任何技能。");
                // 可选地，怪物在这个回合可以恢复一点生命值
                // this.hp += 10;
            }

            // 如果冷却时间大于0，在回合结束时总是减少冷却时间
            if (abilityCooldown > 0) {
                abilityCooldown--;
            }
        }


        // 攻击方法
        // 在 Monster 类中，修改 attack 方法
        public void attack(Player player) {
            Random random = new Random();
            if (random.nextInt(100) < player.dodge) {
                System.out.println("你躲避了 " + this.name + " 的攻击！");
            } else {
                // 暴击判定
                if (random.nextInt(100) < this.dodge) { //  暴击率
                    int damage = (this.attack - player.defense) * 2; // 暴击伤害翻倍
                    player.hp -= damage;
                    System.out.println(this.name + " 发动了暴击！攻击了你，造成了 " + damage + " 点伤害！");
                } else {
                    int damage = this.attack - player.defense;
                    if (damage > 0) {
                        player.hp -= damage;
                        System.out.println(this.name + " 攻击了你，造成了 " + damage + " 点伤害！");
                    } else {
                        System.out.println(this.name + " 的攻击被你防御住了！");
                    }
                }
            }
        }
    }
    static class Equipment {
            String name; // 物品名称
            String type; // 物品类型（武器或护甲）
            int attackBonus; // 攻击力加成
            int defenseBonus; // 防御力加成
            int price; // 价格

            Equipment(String name, String type, int attackBonus, int defenseBonus, int price) {
                this.name = name;
                this.type = type;
                this.attackBonus = attackBonus;
                this.defenseBonus = defenseBonus;
                this.price = price;
            }
        }

         static class Item {
            String name;
            String type; // "治疗", "攻击", "防御", "体力", "闪避", "智力"
            int effect; // 效果值（治疗量、攻击加成等）
            int price;

            Item(String name, String type, int effect, int price) {
                this.name = name;
                this.type = type;
                this.effect = effect;
                this.price = price;
            }
        }


        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            Random random = new Random();
            // 创建玩家
            Player player = new Player(200, 35, 15, 30, 100, 80);  // 设置玩家属性

            while (player.hp > 0) { // 当玩家还有生命值时，继续战斗

                Monster monster = createMonster(random); // 创建怪物

                System.out.println("你遇到了一个 " + monster.level+"级"+ monster.name + "！");

                while (player.hp > 0 && monster.hp > 0) {
                    // 玩家回合
                    System.out.println("你的 HP：" + player.hp + "，" + monster.name + " 的 HP：" + monster.hp);
                    System.out.println("请选择你的行动：1. 攻击 2. 使用技能 3. 使用道具 4. 查看状态 5. 商店 6. 学习技能");
                    int choice = scanner.nextInt();

                    if (choice == 1) {
                        // 玩家攻击
                        player.attack(monster);
                    } else if (choice == 2) {
                        // 玩家使用技能
                        useSkill(player, monster, scanner);

                    } else if (choice == 3) {
                        // 玩家使用道具
                        useItem(player, scanner);

                    } else if (choice == 4) {
                        // 查看状态
                        displayPlayerStatus(player, monster);

                    } else if (choice == 5) {

                        // 进入商店
                        enterShop(player, scanner);

                    } else if (choice == 6) {
                        // 学习技能
                        System.out.println("请选择要学习的技能：1. 火焰魔法 2. 治疗魔法 3. 吸血术");
                        int skillChoice = scanner.nextInt();
                        player.learnSkill(skillChoice);
                    } else {
                        System.out.println("无效的选项！");
                    }
                    player.reduceMagicCooldowns();

                    // 怪物回合
                    if (monster.hp > 0) {
                        // 躲避判定
                        monster.attack(player);
                        monster.useAbility(player); // 怪物使用技能

                    }
                }

                handleBattleResult(player, monster); // 处理战斗结果

            }
            System.out.println("游戏结束！");
            scanner.close();
        }


}